首先了解什么是多线程与进程
进程:是一个执行过程,动态的概念 --->会分配内存
线程:是进程的一个单元,线程是系统最小的执行单元
详解:
http://blog.csdn.net/luoweifu/article/details/46595285
线程的同步与锁详解:
http://blog.51cto.com/lavasoft/99155
synchronized的使用概括:
1.synchronized只锁定同一个对象中的线程,不同对象的线程无法锁定。锁定的对象只能由当前线程执行,其他线程不能执行,直到当前线程被释放。
2.当一个线程访问对象的一个synchronized(this)同步代码块时,另一个线程可以访问这个对象中的非synchronized(this)代码块
3.给一个对象加锁,在run方法中可对一个对象加锁,是的同时只能由一个线程访问此被加锁的对象,其他试图访问account对象的线程将会阻塞,直到该线程访问account对象结束
4.修饰一个方法:
public synchronized void method()
{
}
在用synchronized修饰方法时要注意以下几点:
(1) synchronized关键字不能继承。
(2)在定义接口方法时不能使用synchronized关键字。
(3)构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步。
5.修饰一个静态方法:
静态方法是属于类的而不属于对象的。同样的,synchronized修饰的静态方法锁定的是这个类的所有对象,即此类的所有的对象都受这个同步锁的约束,这与1中的情况不同。
6.修饰一个类,作用同5一样
java中线程锁:一个对象只能有一个锁,当一个线程获得锁之后,其他线程就无法获得,直到这个线程被释放,重要作用就是:防止多个线程同时对一个数据进行处理造成错误
synchronized的使用详解
http://blog.csdn.net/luoweifu/article/details/46613015
Thread中的sleep、wait、yield、notify、notifyall、join方法
sleep()方法会让当前线程暂停执行指定的时间,将执行机会(cpu)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复,且sleep方法暂停后,其他线程都可以有执行的机会,包括低优先级的线程
yield方法与sleep方法类似,但是不能指定用户暂停多长时间,且只能让通优先级的线程有执行的机会
join,使调用join方法的线程执行完毕后,其他线程才能够继续执行,即顺序执行
t1.start();
//等待t1结束,这时候t2线程并未启动
t1.join();
//t1结束后,启动t2线程
t2.start();
//等待t2结束
t2.join();
wait()、notify()、notifyall()都是是object类的方法,wait会让当前线程放弃对象的锁(线程暂停执行),进入对象等待池,只有调用对象的notify方法才能唤醒等待池中的线程进入等锁池,如果线程重新获得对象的锁就可以进入就绪状态。
notifyall方法则是将对象等待池中的所有等待那个对象的线程放到等锁池中
线程的创建方式:1.继承Thread类实现其中的run方法,在run方法中实现执行代码
public class JavaThread extends Thread{
@Override
public void run() {
boolean flag= true;
int i = 0;
while(flag){
System.out.println(getName()+"我是线程1");
if(i++==100){
break;
}
}
System.out.println("我要走了");
}
此方法需要用Thread类new一个线程,然后调用start()方法启用线程
Thread th = new JavaThread();
th.setName("哈哈哈");
th.start();
2.实现runnable接口,实现其中的run方法
class Actress implements Runnable{
@Override
public void run() {
boolean flag= true;
int i = 0;
while(flag){
System.out.println(Thread.currentThread().getName()+"我是线程2");
if(i++==100){
break;
}
}
}
}
Thread t1 = new Thread(new Actress());
actressTh.start();